﻿using CTP.CRM.Core.OTel.Options;
using System.Diagnostics;

namespace CTP.CRM.Core.OTel
{
    //
    // 摘要:
    //     ActivityHelper
    public static class ActivityHelper
    {
        //
        // 摘要:
        //     是否初始化
        private static bool _initialized;

        //
        // 摘要:
        //     获取ActivitySource
        public static ActivitySource ActivitySource { get; private set; }

        //
        // 摘要:
        //     获取OTelOptions
        public static OTelOptions OTelOptions { get; private set; }

        //
        // 摘要:
        //     初始化服务名称
        //
        // 参数:
        //   options:
        //     OTelOptions 配置信息
        public static void InitActivitySource(OTelOptions options)
        {
            if (!_initialized)
            {
                ActivitySource = new ActivitySource(options.ServiceName, options.ServiceVersion);
                OTelOptions = options;
                _initialized = true;
            }
            else
            {
                Debug.WriteLine("ActivityHelper has been initialized");
            }
        }

        //
        // 摘要:
        //     创建SpanActivity
        //
        // 参数:
        //   spanName:
        //     span 名称
        //
        //   kind:
        //     类型
        public static Activity CreateSpanActivity(string spanName, ActivityKind kind = ActivityKind.Internal)
        {
            return ActivitySource.StartActivity(spanName, kind);
        }

        //
        // 摘要:
        //     启动SpanActivity
        //
        // 参数:
        //   spanName:
        //     span名称
        //
        //   tags:
        //     标签
        //
        //   kind:
        //     类型
        public static void StartSpanActivity(string spanName, Dictionary<string, object> tags, ActivityKind kind = ActivityKind.Internal)
        {
            using Activity activity = ActivitySource.StartActivity(spanName, kind);
            if (tags == null)
            {
                return;
            }

            foreach (KeyValuePair<string, object> tag in tags)
            {
                activity.SetTag(tag.Key, tag.Value);
            }
        }

        //
        // 摘要:
        //     启动SpanActivity
        //
        // 参数:
        //   spanName:
        //     span名称
        //
        //   proxyActivity:
        //     代理Activity
        //
        //   kind:
        //     类型
        public static void StartSpanActivity(string spanName, Action<Activity> proxyActivity, ActivityKind kind = ActivityKind.Internal)
        {
            using Activity activity = ActivitySource.StartActivity(spanName, kind);
            try
            {
                proxyActivity?.Invoke(activity);
            }
            catch (Exception ex)
            {
                activity.SetStatus(ActivityStatusCode.Error, ex.ToString());
            }
        }

        //
        // 摘要:
        //     对象转字符串
        //
        // 参数:
        //   obj:
        public static string ToString(this object obj)
        {
            try
            {
                if (OTelOptions != null && OTelOptions.Serializer != null && obj != null)
                {
                    return OTelOptions.Serializer(obj);
                }

                return obj?.ToString();
            }
            catch
            {
                return "Type: " + obj?.GetType().FullName;
            }
        }
    }
}
